/*
 * 中断和异常处理框架头文件
 * 定义中断向量表、处理函数接口和相关数据结构
 */

#ifndef TRAP_H
#define TRAP_H

#include "../fs/types.h"

// 中断和异常原因码定义
#define CAUSE_USER_ECALL        8
#define CAUSE_SUPERVISOR_ECALL  9
#define CAUSE_MACHINE_ECALL     11
#define CAUSE_INSTRUCTION_MISALIGNED    0
#define CAUSE_INSTRUCTION_ACCESS_FAULT  1
#define CAUSE_ILLEGAL_INSTRUCTION       2
#define CAUSE_BREAKPOINT               3
#define CAUSE_LOAD_MISALIGNED          4
#define CAUSE_LOAD_ACCESS_FAULT        5
#define CAUSE_STORE_MISALIGNED         6
#define CAUSE_STORE_ACCESS_FAULT       7
#define CAUSE_INSTRUCTION_PAGE_FAULT   12
#define CAUSE_LOAD_PAGE_FAULT          13
#define CAUSE_STORE_PAGE_FAULT         15

// 中断类型定义
#define IRQ_S_SOFT      1
#define IRQ_M_SOFT      3
#define IRQ_S_TIMER     5
#define IRQ_M_TIMER     7
#define IRQ_S_EXT       9
#define IRQ_M_EXT       11

// 中断处理函数类型
typedef void (*interrupt_handler_t)(void);
typedef void (*exception_handler_t)(uint64 cause, uint64 epc, uint64 tval);

// 陷阱帧结构 - 保存中断/异常时的寄存器状态
struct trapframe {
    /*   0 */ uint64 kernel_satp;   // 内核页表
    /*   8 */ uint64 kernel_sp;     // 内核栈顶
    /*  16 */ uint64 kernel_trap;   // usertrap()地址
    /*  24 */ uint64 epc;           // 保存的用户程序计数器
    /*  32 */ uint64 kernel_hartid; // 保存的内核hart id
    /*  40 */ uint64 ra;
    /*  48 */ uint64 sp;
    /*  56 */ uint64 gp;
    /*  64 */ uint64 tp;
    /*  72 */ uint64 t0;
    /*  80 */ uint64 t1;
    /*  88 */ uint64 t2;
    /*  96 */ uint64 s0;
    /* 104 */ uint64 s1;
    /* 112 */ uint64 a0;
    /* 120 */ uint64 a1;
    /* 128 */ uint64 a2;
    /* 136 */ uint64 a3;
    /* 144 */ uint64 a4;
    /* 152 */ uint64 a5;
    /* 160 */ uint64 a6;
    /* 168 */ uint64 a7;
    /* 176 */ uint64 s2;
    /* 184 */ uint64 s3;
    /* 192 */ uint64 s4;
    /* 200 */ uint64 s5;
    /* 208 */ uint64 s6;
    /* 216 */ uint64 s7;
    /* 224 */ uint64 s8;
    /* 232 */ uint64 s9;
    /* 240 */ uint64 s10;
    /* 248 */ uint64 s11;
    /* 256 */ uint64 t3;
    /* 264 */ uint64 t4;
    /* 272 */ uint64 t5;
    /* 280 */ uint64 t6;
};

// 中断向量表大小
#define MAX_IRQ_NUM 32

// 中断控制接口
void trap_init(void);                                     // 初始化中断系统
void trap_init_hart(void);                               // 初始化当前hart的中断
void register_interrupt(int irq, interrupt_handler_t h); // 注册中断处理函数
void register_exception(int cause, exception_handler_t h); // 注册异常处理函数
void enable_interrupt(int irq);                         // 开启特定中断
void disable_interrupt(int irq);                        // 关闭特定中断

// 中断和异常处理函数
void kerneltrap(void);                                   // 内核态中断处理
uint64 usertrap(void);                                   // 用户态中断处理
void handle_exception(uint64 cause, uint64 epc, uint64 tval); // 异常处理
int devintr(void);                                       // 设备中断处理

// 时钟中断相关
void timer_init(void);                                   // 初始化时钟
void timer_interrupt(void);                              // 时钟中断处理
void set_next_timer(void);                               // 设置下次时钟中断

// 系统调用相关
void syscall(void);                                      // 系统调用处理

// 汇编函数声明
extern void kernelvec(void);                            // 内核中断向量
extern void uservec(void);                              // 用户中断向量
extern void userret(void);                              // 用户返回

// 全局变量
extern uint64 ticks;                                     // 系统时钟计数

#endif // TRAP_H